function ajax( options ) {
      // 默认参数如何应用;
      var d = {
            type : "GET"
      }
      // 我们把options对象里面的所有内容全部放入到d对象之中; 
      for(var attr in options){
            d[attr] = options[attr];
      }
      // 把合并后的默认对象赋值给options容器; 
      options = d;
      // 如果传入了默认参数，那么就用传入的参数覆盖默认参数; 
      // - 如果没有传入默认参数，那么就使用默认参数; 

      // 1. 查看请求方式是不是get，如果是吧数据放入到url之中; 
      // - 可能存在一种情况 : 我们没有传递data参数; 
      // - 如果我们传递了data我们采取进行拼接; 

      // 用户传入的是对象 => 我们要吧对象变成字符串; 
      // { name : 123 , age : 456 }
      // for(var attr in options.data ) attr : name , age 
      // "name=123&age=456" => name=123 , age=456


      // 如何判定一个变量里面装的是不是对象; 
      // - typeof必须是object，并且不是数组，不是null;
      if( typeof options.data === "object" && !(options.data instanceof Array) && options.data !== null){
            // 字符串拼接
            var temp = "";
            for(var attr in options.data){
                  temp += `&${ attr }=${ options.data[attr] }`
                  options.data = temp.slice(1)
            }     
            // 字符串拼接之后，开头多出了一个&字符; 
            // 我们把options.data里面的对象替换成字符串; 
           ;
      }
      

      if (options.type.toUpperCase() === "GET" && options.data) {
            options.url += "?" + options.data;
      }

      var xhr = new XMLHttpRequest();

      xhr.open(options.type, options.url);

      if (options.type.toUpperCase() === "POST" && options.data) {
            xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

            xhr.send(options.data);
      } else {
            xhr.send();
      }

      xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200) {
                  options.callback(xhr.responseText);
            }
      }
}